package com.problem.dynamicProgramming;

/**
 * @author yyh
 * @date 2024年11月14日 上午10:53
 * <a href="https://leetcode.cn/problems/house-robber/?envType=study-plan-v2&envId=top-interview-150">...</a>
 */
public class Rob {
    //你是一个专业的小偷，计划偷窃沿街的房屋。每间房内都藏有一定的现金，影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统，如果两间相邻的房屋在同一晚上被小偷闯入，系统会自动报警。
    //给定一个代表每个房屋存放金额的非负整数数组，计算你 不触动警报装置的情况下 ，一夜之内能够偷窃到的最高金额。
    //
    //示例 1：
    //
    //输入：[1,2,3,1]
    //输出：4
    //解释：偷窃 1 号房屋 (金额 = 1) ，然后偷窃 3 号房屋 (金额 = 3)。
    //     偷窃到的最高金额 = 1 + 3 = 4 。
    //示例 2：
    //
    //输入：[2,7,9,3,1]
    //输出：12
    //解释：偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9)，接着偷窃 5 号房屋 (金额 = 1)。
    //     偷窃到的最高金额 = 2 + 9 + 1 = 12 。

    //提示：
    //1 <= nums.length <= 100
    //0 <= nums[i] <= 400

    public int rob(int[] nums) {
        if (nums.length == 1) {
            return nums[0];
        }

        //S(n) = Max(S(n-2) + H(n), S(n-1))

        //前n间房最大金额
        int s0 = nums[0];
        int s1 = Math.max(nums[0], nums[1]);
        if (nums.length == 2) {
            return s1;
        }

        int[] sArr = new int[nums.length];
        sArr[0] = s0;
        sArr[1] = s1;
        for (int i = 2; i < nums.length; i++) {
            int h = nums[i];
            sArr[i] = Math.max(sArr[i-2] + h,sArr[i-1]);
        }

        return sArr[nums.length - 1];
    }

    public static void main(String[] args) {
        Rob rob = new Rob();
        System.out.println(rob.rob(new int[]{1,2,3,1}));
        System.out.println(rob.rob(new int[]{2,7,9,3,1}));
    }
}
